using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public BairroVO getBairro(int? idBairro)
		{
			BairroVO bairroVO = null;
			List<BairroVO> listBairroVOs = getBairros(idBairro, null, null);
			if (listBairroVOs != null && listBairroVOs.Count > 0)
			{
				bairroVO = listBairroVOs[0];
			}
			return bairroVO;
		}

		public List<BairroVO> getBairros()
		{
			return getBairros(null, null, null);
		}

		public List<BairroVO> getBairros(int? idBairro)
		{
			return getBairros(idBairro, null, null);
		}
        
		public List<BairroVO> getBairros(int? idBairro, int? idCidade, string bairro)
		{
            return getBairros(idBairro, idCidade, bairro, null);
        }

		public List<BairroVO> getBairros(int? idBairro, int? idCidade, string bairro, int? idUf)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT bai.idBairro as bai_idBairro, bai.idCidade as bai_idCidade, uf.sigla as uf_sigla, cid.cidade as cid_cidade, bai.bairro as bai_bairro, bai.Cadastro as bai_Cadastro, bai.CadastradoPor as bai_CadastradoPor, bai.Edicao as bai_Edicao, bai.EditadoPor as bai_EditadoPor  ");
			query.AppendLine("FROM bairro as bai ");
            query.AppendLine("  LEFT OUTER JOIN cidade as cid on bai.idCidade=cid.idCidade  ");
            query.AppendLine("      LEFT OUTER JOIN uf as uf on uf.idUf=cid.idUf    ");
			if (idBairro != null)
			{
				query.AppendLine(where + "bai.idBairro=@idBairro ");
				where = "AND ";
			}
			if (idCidade != null)
			{
				query.AppendLine(where + "bai.idCidade=@idCidade ");
				where = "AND ";
			}
			if (bairro != null)
			{
				query.AppendLine(where + "bai.bairro=@bairro ");
				where = "AND ";
			}
            if (idUf != null)
            {
                query.AppendLine(where + "uf.idUf=@idUf ");
                where = "AND ";
            }


			query.AppendLine("ORDER BY bai.idBairro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idBairro!= null) cmd.Parameters.Add(getParameter(cmd, "@idBairro", idBairro));
			if (idCidade!= null) cmd.Parameters.Add(getParameter(cmd, "@idCidade", idCidade));
			if (bairro!= null) cmd.Parameters.Add(getParameter(cmd, "@bairro", bairro));
            if (idUf != null) cmd.Parameters.Add(getParameter(cmd, "@idUf", idUf));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<BairroVO> listBairro = new List<BairroVO>();

				while (reader.Read())
				{
					BairroVO bairroVO = BairroVO.CreateVO();
					bairroVO.idBairro = reader.GetInt32(reader.GetOrdinal("bai_idBairro"));
					bairroVO.idCidade = reader.GetInt32(reader.GetOrdinal("bai_idCidade"));

                    bairroVO.idCidadeVO = new SgiDAOT().getCidade(bairroVO.idCidade);

                    bairroVO.uf = reader.GetString(reader.GetOrdinal("uf_sigla"));
					if (!reader.IsDBNull(reader.GetOrdinal("cid_cidade")))
						bairroVO.idCidadeVO.cidade = reader.GetString(reader.GetOrdinal("cid_cidade"));
					bairroVO.bairro = reader.GetString(reader.GetOrdinal("bai_bairro"));
					bairroVO.cadastro = reader.GetDateTime(reader.GetOrdinal("bai_Cadastro"));
					bairroVO.cadastradoPor = reader.GetString(reader.GetOrdinal("bai_CadastradoPor"));
					bairroVO.edicao = reader.GetDateTime(reader.GetOrdinal("bai_Edicao"));
					bairroVO.editadoPor = reader.GetString(reader.GetOrdinal("bai_EditadoPor"));


					listBairro.Add(bairroVO);
				}
				reader.Close();
				return listBairro;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setBairro(BairroVO bairroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE bairro ");
			query.AppendLine("SET idCidade=@idCidade, bairro=@bairro,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idBairro=@idBairro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idBairro", bairroVO.idBairro));
			cmd.Parameters.Add(getParameter(cmd, "@idCidade", bairroVO.idCidade));
			cmd.Parameters.Add(getParameter(cmd, "@bairro", bairroVO.bairro));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", bairroVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", bairroVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", bairroVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", bairroVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newBairro(BairroVO bairroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO bairro ");
			query.AppendLine("  ( idCidade, bairro, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idCidade, @bairro, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCidade", bairroVO.idCidade));
			cmd.Parameters.Add(getParameter(cmd, "@bairro", bairroVO.bairro));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", bairroVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", bairroVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", bairroVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", bairroVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('bairro') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delBairro(BairroVO bairroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM bairro ");
			query.AppendLine("WHERE idBairro=@idBairro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idBairro", bairroVO.idBairro));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountBairroxIdCidade(int? idCidade)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCidade) as ocorrencias FROM bairro WHERE IdCidade=@IdCidade ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCidade", idCidade));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
